#pragma once
// -------------------------------------------------
// ZED Kit
// -------------------------------------------------
//   File Name: bitset.hpp
//      Author: Ziming Li
//     Created: 2023-10-01
// -------------------------------------------------
// Copyright (C) 2023 MingYang Software Technology.
// -------------------------------------------------

#ifndef ZED_BITSET_HPP
#define ZED_BITSET_HPP

#include <bitset>

namespace zed {

template <size_t N, typename... Args>
constexpr std::bitset<N> make_bitset(Args... args);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Implementations

namespace detail {

template <size_t N>
constexpr std::bitset<N> mask_bits(std::bitset<N> bits, size_t index)
{
    bits.set(index);
    return bits;
}

template <size_t N, typename... Args>
constexpr std::bitset<N> mask_bits(std::bitset<N> bits, size_t index, Args... args)
{
    bits.set(index);
    return mask_bits<N>(bits, args...);
}

} // namespace detail

template <size_t N, typename... Args>
constexpr std::bitset<N> make_bitset(Args... args)
{
    return detail::mask_bits<N>(std::bitset<N>(), args...);
}

template <size_t N>
constexpr std::bitset<N> make_bitset(void)
{
    return std::bitset<N>();
}

} // namespace zed

#endif // ZED_BITSET_HPP
